package com.soloyogame.anitoys.util;

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;


/**
 * gson 序列化工具类
 * @author shaojian
 */
public class JsonUtil 
{
	
	private static Gson gson = null;
	static 
	{
		if (gson == null) 
		{
			gson = new Gson();
		}
	}


	/**
	 * 将对象转换成json格式
	 * @param ts
	 * @return
	 */
	public static String objectToJson(Object ts) 
	{
		String jsonStr = null;
		if (gson != null) 
		{
			jsonStr = gson.toJson(ts);
		}
		return jsonStr;
	}

	/**
	 * 将对象转换成json格式(并自定义日期格式)
	 * @param ts
	 * @return
	 */
	public static String objectToJson(Object ts, final String dateformat) 
	{
		if(ts==null)
		{
			return null;
		}
		else
		{
			String jsonStr = null;
			gson = new GsonBuilder()
					.registerTypeHierarchyAdapter(Date.class,
							new JsonSerializer<Date>() 
							{
								public JsonElement serialize(Date src,
										Type typeOfSrc,
										JsonSerializationContext context) 
								{
									SimpleDateFormat format = new SimpleDateFormat(
											dateformat);
									return new JsonPrimitive(format.format(src));
								}
							}).setDateFormat(dateformat).create();
			if (gson != null) 
			{
				jsonStr = gson.toJson(ts);
			}
			return jsonStr;
		}
	}

	/**
	 * 将json格式转换成list对象
	 * @param jsonStr
	 * @return
	 */
	public static List<?> jsonToList(String jsonStr) 
	{
		List<?> objList = null;
		if (gson != null) 
		{
			java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<?>>(){}.getType();
			objList = gson.fromJson(jsonStr, type);
		}
		return objList;
	}
	
	/**
	 * 将json格式转换成list对象
	 * 
	 * @param jsonStr
	 * @return
	 */
	public static List<?> jsonToList(String jsonStr,Type type) {
		List<?> objList = null;
		if (gson != null) {
			objList = gson.fromJson(jsonStr, type);
		}
		return objList;
	}
	
	

	/**
	 * 将json格式转换成map对象
	 * 
	 * @param jsonStr
	 * @return
	 */
	public static Map<String, String> jsonToMap(String jsonStr) {
		Map<String, String> objMap = null;
		if (gson != null) {
			java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<Map<String, String>>() {
			}.getType();
			objMap = gson.fromJson(jsonStr, type);
		}
		return objMap;
	}

	/**
	 * 将json转换成bean对象
	 * 
	 * @param jsonStr
	 * @return
	 */
	public static Object jsonToBean(String jsonStr, Class<?> cl) {
		Object obj = null;
		if (gson != null) {
			obj = gson.fromJson(jsonStr, cl);
		}
		return obj;
	}

	/**
	 * 将json转换成bean对象
	 * @param jsonStr
	 * @param cl
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T jsonToBeanDateSerializer(String jsonStr, Class<T> cl,
			final String pattern) {
		Object obj = null;
		gson = new GsonBuilder()
				.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
					public Date deserialize(JsonElement json, Type typeOfT,
							JsonDeserializationContext context)
							throws JsonParseException {
						SimpleDateFormat format = new SimpleDateFormat(pattern);
						String dateStr = json.getAsString();
						try {
							return format.parse(dateStr);
						} catch (ParseException e) {
							e.printStackTrace();
						}
						return null;
					}
				}).setDateFormat(pattern).create();
		if (gson != null) {
			obj = gson.fromJson(jsonStr, cl);
		}
		return (T) obj;
	}

	public static Object getJsonValue(String jsonStr, String key) 
	{
		Object rulsObj = null;
		Map<?, ?> rulsMap = jsonToMap(jsonStr);
		if (rulsMap != null && rulsMap.size() > 0) 
		{
			rulsObj = rulsMap.get(key);
		}
		return rulsObj;
	}
	
	/**
	 * GSON 转OBJECT
	 */
	public static Object jsonToObject(String json, Type type) {
		GsonBuilder builder = new GsonBuilder();
		Gson gson = builder.setDateFormat("yyyy-MM-dd HH:mm:ss").create();
		return gson.fromJson(json, type);
	}

	/**
	 * json      ArrayList,    Ϊnew TypeToken<ArrayList<T>>() {},    ӷ   
	 */
	public static List<?> jsonToList(String json, TypeToken<?> token) {
		return (List<?>) jsonToObject(json, token.getType());
	}
	
	/**
	 * 主测试类
	 * @param args
	 */
	public static void main(String[] args) 
	{
	}
}
